import axios from 'axios'
import JSZip from 'jszip'
import { ElMessage } from 'element-plus'

/**
 * 判断对象是否为空
 * @param obj
 * @returns
 */
function isEmpty (obj) {
  // 数字判空
  if (isNumber(obj)) {
    return false
  }
  // 字符串和数组判空
  if (obj && obj.length > 0) {
    return false
  }
  // 按照对应的数据类型进行数据判空
  const objType = Object.prototype.toString.call(obj)
  // 字符串和数组判空
  if (objType === '[object Array]' || objType === '[object String]') {
    if (obj && obj.length > 0) {
      return false
    }
  }
  // 如果是对象
  if (objType === '[object Object]' && !(JSON.stringify(obj) === '{}')) {
    return false
  }
  return true
}

function isNotEmpty (obj) {
  return !isEmpty(obj)
}

function msgSuccess (obj) {
  if (process.env.NODE_ENV !== 'production') {
    ElMessage.success(obj)
  }
}

function msgError (obj) {
  if (process.env.NODE_ENV !== 'production') {
    ElMessage.error(obj)
  }
}

/**
 * 判断是否为数字
 * @param obj
 * @returns
 */
function isNumber (obj) {
  if (parseFloat(obj).toString() === 'NaN') {
    return false
  }
  return true
}

function includeString (str, substr) {
  return str.includes(substr)
}

/**
 * 判断 字符串2 是否等于 字符串1 或 为空
 * @param str
 * @param substr
 * @returns {boolean}
 */
function emptyEqual (str, substr) {
  return isEmpty(substr) || str === substr
}

function getStrOrEmpty (str) {
  return isNotEmpty(str) ? str : ''
}

function handleArrEmpty (arr) {
  arr = arr.map(item => isEmpty(item) ? '' : item)
  return arr
}

// 表单重置
export function resetForm (refName) {
  if (this.$refs[refName]) {
    this.$refs[refName].resetFields()
  }
}

/**
 * 从zip或pdf的url中获取可预览的objecturl
 * @param fileUrl
 * @returns {*|null}
 */
async function getObjectUrlFromFileUrl (fileUrl) {
  if (fileUrl.endsWith('.pdf')) {
    // .pdf文件链接
    return fileUrl
  } else if (fileUrl.endsWith('.zip')) {
    // .zip文件链接
    axios({
      url: fileUrl,
      method: 'GET',
      responseType: 'blob'
    }).then((response) => {
      const blob = new Blob([response.data], { type: 'application/zip' })
      const zip = new JSZip()
      zip.loadAsync(blob).then(async (zip) => {
        const pdfEntry = Object.values(zip.files).find((entry) => entry.name.endsWith('.pdf'))
        if (!pdfEntry) {
          alert('ZIP文件中没有找到PDF文件。')
          return null
        }
        const pdfBlob = new Blob([await pdfEntry.async('blob')], { type: 'application/pdf' })
        const objectURL = URL.createObjectURL(pdfBlob)
        return objectURL
        // return pdfEntry.async('arraybuffer')
        // 使用pdfUrl在新标签页中打开PDF等
        // window.open(pdfUrl)
      })
    }).catch((error) => {
      console.log('错误：', error)
    })
  } else {
    return null
  }
}

// 双击复制事件
export function copyTableCellText (row, column, cell, event) {
  // 双击复制
  const save = function (e) {
    e.clipboardData.setData('text/plain', event.target.innerText)
    e.preventDefault()// 阻止默认行为
  }
  document.addEventListener('copy', save)// 添加一个copy事件
  document.execCommand('copy')// 执行copy方法
  this.$message.success('内容已复制到剪切板！')
}

export default {
  isNumber,
  isEmpty,
  isNotEmpty,
  includeString,
  emptyEqual,
  getObjectUrlFromFileUrl,
  getStrOrEmpty,
  handleArrEmpty,
  msgSuccess,
  msgError,
  resetForm,
  copyTableCellText
}
